#ifndef LISTA_H
#define LISTA_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "NoSolucao.h"

class ListaSolucao{
 private:
     	NoSolucao *inicio;
	int count;

 public: 
    	ListaSolucao(){
		this->inicio=NULL;
    		this->count = 0;
	}

    	int vazia(){
		if (this->inicio==NULL)
      			return(1);
      		else
      			return(0);
	}
	//Insere ordenando a lista
    	int insert(Solucao *sol){
		this->count++;
        	NoSolucao *aux = new NoSolucao(sol);
                                                                                
        	if (aux == NULL)
                	return 0;
		
		if (this->inicio==NULL){
                	this->inicio=aux;
		}else{
			NoSolucao *ant, *suc;
			ant = this->inicio; suc = this->inicio->prox;
			while(ant->sol->avaliacao < sol->avaliacao){
				if(suc == NULL){
					ant->prox = aux;
					return 1;
				}else{
					if(suc->sol->avaliacao >= sol->avaliacao){
						ant->prox = aux; aux->prox = suc;
						return 1;
					}else{
						ant = suc; suc = suc->prox;
					}
				}
			}
			
			aux->prox = ant;
			this->inicio = aux;
		}
                                                                                
        	return 1;
	}

    	//Remove a solucao mais bem avaliada
	Solucao *remove(){
		this->count--;
                                                                                
        	if (this->vazia())
                	return 0;
                                                                                
        	NoSolucao *aux = this->inicio;
        	Solucao *sol = this->inicio->sol;
       	
		this->inicio=this->inicio->prox;
		aux->sol = NULL;
		delete aux;
                                                                                
        	return sol;
	}

	~ListaSolucao(){
		while(this->inicio != NULL){
			Solucao *aux = remove();
			delete aux;
		}
	}
};

#endif
